/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import tesis.controller.util.FileBean;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import tesis.dto.in.*;
import tesis.dto.out.FormDTO;
import tesis.dto.out.InputFormDTO;

import tesis.service.ClientTestService;
import tesis.util.MotorInvoker;
import tesis.utils.JSONUtil;
import tesis.utils.PropertyUtils;

/**
 *
 * @author hectdx
 */
@Controller("testController")
@RequestMapping(value="/testCliente")
public class TestController {
   
    private final static Logger LOG =LoggerFactory.getLogger(TestController.class);
    
    @Inject
    private ClientTestService clientTestService;
    private InstanciaEstacionDTO instancia; 
    
    private  final static String  url=PropertyUtils.getAppProperty("url.motor");
    //private  final static String  ruta_archivos="/home/hectdx/3bpm-files/";
    
    @RequestMapping(value="/primeraEstacion",method= RequestMethod.GET)
    public String primeraEstacion(HttpServletRequest request, Model model, @RequestParam(required=false) String nombreEstacion,
                                                                            @RequestParam(required=false) Integer idproceso,
                                                                            @RequestParam(required=false) Integer idUsuario,
                                                                            @RequestParam(required=false) Integer idInstanciaEstacion,
                                                                            @RequestParam(required=false) Integer idInstanciaProceso){
         String estacionJSON=null;
         String tiposDocumentoJSON=null;
         FormDTO valoresAnteriores=null;
        try {
            InstanciaEstacionDTO instancionDTO= new InstanciaEstacionDTO();
            InstanciaProcesoDTO instProceso = new InstanciaProcesoDTO();
            instProceso.setIdproceso(idproceso);
            instancionDTO.setIdinstanciaestacion(idInstanciaEstacion);
            instProceso.setIdinstanciaproceso(idInstanciaProceso);
            UsuarioDTO usuario = new UsuarioDTO();
            usuario.setIdusuario(idUsuario);

           
            
            LOG.info("procesando GET /primeraEstacion");
       
             instancionDTO.setNombreEstacion(nombreEstacion);
             instancionDTO.setInstanciaProceso(instProceso);
             instancionDTO.setUsuario(usuario);

             
             this.instancia = instancionDTO;
             estacionJSON=JSONUtil.convertObjectToJSON(instancionDTO);
             
             
             EstacionDTO est = MotorInvoker.getStationByName(instancionDTO.getInstanciaProceso().getIdproceso(),url, instancionDTO.getNombreEstacion());
             FormDTO inputs=MotorInvoker.getVariablesForm(url, est.getIdEstacion());
             List<TipoDocumentoDTO> lstTipoDocumento=MotorInvoker.getTipoDocumento(url, est.getIdEstacion()).getListTipoDocumentoDTO();
             
             if (idInstanciaEstacion!=null){
                valoresAnteriores=MotorInvoker.getValoresEstacionAnterior(url, idInstanciaProceso, idInstanciaEstacion);
                //presetea los valores
                for(InputFormDTO i:inputs.getInputs()){
                        i.setValor(valoresAnteriores.getValor(i.getNombre()));
                }
             }
                     
             tiposDocumentoJSON=JSONUtil.convertObjectToJSON(lstTipoDocumento);
                     
             model.addAttribute("estacionJSON",estacionJSON);
             model.addAttribute("lstInputs", inputs);
             model.addAttribute("tiposDocumentoJSON",tiposDocumentoJSON);
             
        } catch (JsonGenerationException ex) {
            java.util.logging.Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JsonMappingException ex) {
            java.util.logging.Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            java.util.logging.Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return "apCliente/primeraEstacion";
    }
    
    
    @RequestMapping(value="/metodo",method= RequestMethod.POST)
    @ResponseBody
    public Map metodo(@RequestBody FormDTO datosFormulario, HttpServletRequest request) throws IOException{
      Map map = new HashMap();
      ExecuteStationDTO result=null;
      List<InputFormDTO> files=null;
      String fileName=null;
      LOG.info("procesando POST /metodo");
      
      files=(List<InputFormDTO>)request.getSession().getAttribute("files");
      
      if (files!=null){
          datosFormulario.getInputs().addAll(files);
      }
      
      result=clientTestService.procesarDatos(datosFormulario, instancia); 
      map.put("data", result) ;
      if (result.isError()){
          map.put("error", result.getMensaje()) ;
      }
      
      request.getSession().removeAttribute("files");
      
     return map;
    }
    
    
    @RequestMapping(value="/load",method= RequestMethod.POST)
    @ResponseBody
    public Map load(FileBean files,HttpServletRequest request) throws IOException{
      Map map = new HashMap();
      String fileName=null;
      List<InputFormDTO> inputDocs=new ArrayList();
      LOG.info("procesando POST /load");
      
      
       if (files.getFiles() != null) {
            for (String key : files.getFiles().keySet()) {
                MultipartFile file = files.getFiles().get(key);
                fileName = file.getOriginalFilename();
                
                if (fileName != null && !fileName.isEmpty()) { //si es nulo se cae
                   InputFormDTO archivoForm=new InputFormDTO();
                    archivoForm.setDocumento(true);
                    archivoForm.setNombre(key);
                    archivoForm.setValor(fileName);
                    //File f=new File(ruta_archivos+fileName);
                    //file.transferTo(f);
                    File temp = File.createTempFile(fileName, "");
                    temp.deleteOnExit();
                    file.transferTo(temp);
                    archivoForm.setFile(temp);
                    inputDocs.add(archivoForm);
                    //LOG.info(f.getAbsoluteFile().toString());
                }
                
            }
      }
      request.getSession().setAttribute("files", inputDocs);
        
     return map;
    }
    
    
    
    
}
